home *** CD-ROM | disk | FTP | other *** search
- /* Routines to perform incremental rotations around the three axes */
- #include <math.h>
- #include "polygon.h"
-
- /* Concatenate a rotation by Angle around the X axis to the
- transformation in XformToChange, placing result back in
- XformToChange. */
- void AppendRotationX(double XformToChange[4][4], double Angle)
- {
- double Temp10, Temp11, Temp12, Temp20, Temp21, Temp22;
- double CosTemp = cos(Angle), SinTemp = sin(Angle);
-
- /* Calculate the new values of the four affected matrix entries */
- Temp10 = CosTemp*XformToChange[1][0]+ -SinTemp*XformToChange[2][0];
- Temp11 = CosTemp*XformToChange[1][1]+ -SinTemp*XformToChange[2][1];
- Temp12 = CosTemp*XformToChange[1][2]+ -SinTemp*XformToChange[2][2];
- Temp20 = SinTemp*XformToChange[1][0]+ CosTemp*XformToChange[2][0];
- Temp21 = SinTemp*XformToChange[1][1]+ CosTemp*XformToChange[2][1];
- Temp22 = SinTemp*XformToChange[1][2]+ CosTemp*XformToChange[2][2];
- /* Put the results back into XformToChange */
- XformToChange[1][0] = Temp10; XformToChange[1][1] = Temp11;
- XformToChange[1][2] = Temp12; XformToChange[2][0] = Temp20;
- XformToChange[2][1] = Temp21; XformToChange[2][2] = Temp22;
- }
-
- /* Concatenate a rotation by Angle around the Y axis to the
- transformation in XformToChange, placing result back in
- XformToChange. */
- void AppendRotationY(double XformToChange[4][4], double Angle)
- {
- double Temp00, Temp01, Temp02, Temp20, Temp21, Temp22;
- double CosTemp = cos(Angle), SinTemp = sin(Angle);
-
- /* Calculate the new values of the four affected matrix entries */
- Temp00 = CosTemp*XformToChange[0][0]+ SinTemp*XformToChange[2][0];
- Temp01 = CosTemp*XformToChange[0][1]+ SinTemp*XformToChange[2][1];
- Temp02 = CosTemp*XformToChange[0][2]+ SinTemp*XformToChange[2][2];
- Temp20 = -SinTemp*XformToChange[0][0]+ CosTemp*XformToChange[2][0];
- Temp21 = -SinTemp*XformToChange[0][1]+ CosTemp*XformToChange[2][1];
- Temp22 = -SinTemp*XformToChange[0][2]+ CosTemp*XformToChange[2][2];
- /* Put the results back into XformToChange */
- XformToChange[0][0] = Temp00; XformToChange[0][1] = Temp01;
- XformToChange[0][2] = Temp02; XformToChange[2][0] = Temp20;
- XformToChange[2][1] = Temp21; XformToChange[2][2] = Temp22;
- }
-
- /* Concatenate a rotation by Angle around the Z axis to the
- transformation in XformToChange, placing result back in
- XformToChange. */
- void AppendRotationZ(double XformToChange[4][4], double Angle)
- {
- double Temp00, Temp01, Temp02, Temp10, Temp11, Temp12;
- double CosTemp = cos(Angle), SinTemp = sin(Angle);
-
- /* Calculate the new values of the four affected matrix entries */
- Temp00 = CosTemp*XformToChange[0][0]+ -SinTemp*XformToChange[1][0];
- Temp01 = CosTemp*XformToChange[0][1]+ -SinTemp*XformToChange[1][1];
- Temp02 = CosTemp*XformToChange[0][2]+ -SinTemp*XformToChange[1][2];
- Temp10 = SinTemp*XformToChange[0][0]+ CosTemp*XformToChange[1][0];
- Temp11 = SinTemp*XformToChange[0][1]+ CosTemp*XformToChange[1][1];
- Temp12 = SinTemp*XformToChange[0][2]+ CosTemp*XformToChange[1][2];
- /* Put the results back into XformToChange */
- XformToChange[0][0] = Temp00; XformToChange[0][1] = Temp01;
- XformToChange[0][2] = Temp02; XformToChange[1][0] = Temp10;
- XformToChange[1][1] = Temp11; XformToChange[1][2] = Temp12;
- }
-